#!/usr/bin/python2.7
#coding:UTF-8
 
'''
.................................................................................
Created on 31 марта 2014 г.

@author: nww
.................................................................................
'''
import wxversion
wxversion.select('2.8')
import wx
# Модуль MV1_oscilloscope_xrc автоматически генерируетчя программой xrced
import MV1_oscilloscope_xrc
# 
from TCP_server import TCP_server
#from numpy import arange, sin, pi
import matplotlib
matplotlib.use('WXAgg')
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar
from matplotlib.figure import Figure
#from Queue import Queue
from wx.lib.pubsub import Publisher

class MainApp( MV1_oscilloscope_xrc.xrcMainFrame ):
    ''' Для того чтобы не трогать файл MV1_oscilloscope_xrc, который генерируется автоматически
    программой xrced, определяем свой класс - наследник от класса определённого в MV1_oscilloscope_xrc.
    Это нужно чтобы добавить объект matplotlib.figure на панель notebook.oscill_panel сгенрированную xrced.
    '''
    # === INITIALIZATION =================================================================================
    def __init__(self, parent):
        #Initialize the main form
        MV1_oscilloscope_xrc.xrcMainFrame.__init__( self, parent )
        #Create chart
        self.sizer = self.oscill_panel.GetSizer()
        self.plot_container = self.plot_panel
        self.plotpanel = CreatePlot(self.plot_container, self.statusBar)
        self.line1, = self.plotpanel.axes.plot([], [], 'b-')
        # Создаём приёмник pubsub
        Publisher().subscribe(self.updateDisplay, 'update')
        self.TCP_server = TCP_server()
        self.TCP_server.start()
        
    def __del__(self):
        self.TCP_server.exitFlag = True
        print 'Good bye'
        
    def updateDisplay(self, msg):
        ''' Получаем сообщение от TCP сервера и обновляем график '''
        t,s = msg.data
        self.line1.set_data(t, s)
        self.plotpanel.figure.canvas.draw()

class CreatePlot(wx.Panel):
    def __init__(self, parent, statusBar):
        wx.Panel.__init__(self, parent, -1)
        
        self.statusBar = statusBar
        
        self.figure = Figure(figsize=(5,4), dpi=100)
        self.axes = self.figure.add_subplot(111)
        self.axes.grid()
        self.axes.set_xlim((0,300))
        self.axes.set_ylim((0,256))
#        self.axes.set_title(u'Oscilloscope')
        self.axes.set_xlabel(u't')
        self.axes.set_ylabel(u'V')
        
        self.canvas = FigureCanvas(parent, -1, self.figure)
        self.toolbar = NavigationToolbar(self.canvas)

        # Note that event is a MplEvent
        self.canvas.mpl_connect('motion_notify_event', self.UpdateStatusBar)
        self.canvas.Bind(wx.EVT_ENTER_WINDOW, self.ChangeCursor)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
#        sizer.Add(self.t_label)
        sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
        sizer.Add(self.canvas, 1, wx.TOP | wx.LEFT | wx.EXPAND)
        parent.SetSizer(sizer)
        parent.Fit()

    def ChangeCursor(self, event):
        self.canvas.SetCursor(wx.StockCursor(wx.CURSOR_BULLSEYE))

    def UpdateStatusBar(self, event):
        if event.inaxes:
            t, V = event.xdata, event.ydata
            self.statusBar.SetStatusText(( "t= " + str(t) +
                                           "  V=" +str(V) ),
                                           0)

if __name__ == '__main__':
    # === RUN ==========================================================================================
    #Get the wxApp
    app = wx.App(0)
    #Show the form
    MainApp(None).Show()
    #Run
    app.MainLoop()